
#include "euler.h"

int isConnected(Matrix *matrix)
{
	int res = 1;
	// Malgrange retourne une liste de CFC, s'il n'y en a qu'une seule, cela veut dire que le graphe est connexe
	// NE FONCTIONNE QUE SI GRAPHE EST NON ORIENTE
	
	llist* mg_res = malgrange(matrix);
	if(mg_res[1] != NULL) { // donc si il y a en position 1 de mg_res quelque chose (si il y a donc au moins 2 CFC), le graphe n'est pas connexe
		res = 0;
	}
	
	// très court donc on peut marquer en dur le nombre d'action #SALE !
	printf("\n-- Pour information la fonction \"isConnected\" a effectue 4 actions (a ajouter aux nombres d'actions faites par les fonctions appelees dans celle-ci) --\n \n");
	return res;
}

void euler(Matrix *matrix){
	int nombre_action = 0; // pour compter le nombre d'actions
	if(isConnected(matrix) == 1) // si le graphe n'est pas connexe de toute façon il n'y a aucune action eulerienne possible
	{

		int i,j;
		int sommets_impairs = 0;
		int arete_sommet_courant = 0;
		
		nombre_action = 4; // pour compter le nombre d'actions (+4 pour les affectations de variable)
		for(i=0 ; i < matrix->size ; i++)
		{ //printf("i = %d\n",i);
			for(j=0 ; j < matrix->size ; j++)
			{ //printf("j = %d\n",j);
				if(matrix->table[i][j] == 1) // on parcourt chaque case du sommet & s'il y a un 1 c'est qu'il y a une arete
				{ 	//printf("JE RENTRE DANS LE PREMIER IF\n");
					arete_sommet_courant++;
					nombre_action++; // pour compter le nombre d'actions
				} 
			} 
			
			//printf("ON SORT DE LA BOUCLE");
			if(arete_sommet_courant %2 != 0) // si le nombre d'arete est impair
			{ 
				sommets_impairs++;
				nombre_action++; // pour compter le nombre d'actions
			} 
			 
			arete_sommet_courant = 0; // on réinitialise pour le sommet suivant
			nombre_action++; // pour compter le nombre d'actions
		}
		
		if(sommets_impairs == 0)
		{
			printf("-- Pour information cette fonction a effectue %d actions (a ajouter aux nombres d'actions faites par les fonctions appelees dans celle-ci) --\n\n", nombre_action+1);
		
		  printf("Circuit eulerien possible (graphe connexe et aucun sommet de degre impair)\n\n");
			
		}
		else if (sommets_impairs == 2)
		{
			printf("-- Pour information cette fonction a effectue %d actions (a ajouter aux nombres d'actions faites par les fonctions appelees dans celle-ci) --\n\n", nombre_action+1);
		
		  printf("Parcours eulerien possible (graphe connexe et 2 sommets de degre impair)\n\n");
			
		}
		else
		{
			printf("-- Pour information cette fonction a effectue %d actions (a ajouter aux nombres d'actions faites par les fonctions appelees dans celle-ci) --\n\n", nombre_action+1);
			printf("N'est pas eulerien (nombre de sommets de degré impair insatisfaisant)\n\n");
		}
	}
	else
	{
	printf("-- Pour information cette fonction a effectue %d actions (a ajouter aux nombres d'actions faites par les fonctions appelees dans celle-ci) --\n\n", nombre_action+1);
	  printf("N'est pas eulerien (le graphe n'est pas connexe)\n\n");
	}

}